常用Shader函数

查找对应函数时用法时可以直接 Ctrl/Command + F

Unity 内置辅助方法

摘自官方API文档 民间汉化

顶点变换函数 (in UnityCG.cginc)

函数名 使用说明
float4 UnityObjectToClipPos(float3 pos) 将点从对象空间转换为相机
齐次坐标下的剪辑空间。这相当于mul(UNITY_MATRIX_MVP,float4(pos,1.0))。
float3 UnityObjectToViewPos(float3 pos) 将点从对象空间转换为视图空间。这相当于mul(UNITY_MATRIX_MV,float4(pos,1.0)).xyz。

通用辅助函数 (in UnityCG.cginc)

函数名 使用说明
float3 WorldSpaceViewDir (float4 v) 返回从给定对象空间顶点位置到摄像机的世界空间方向(未归一化)。
float3 ObjSpaceViewDir (float4 v) 返回从给定对象空间顶点位置到相机的对象空间方向(未归一化)。
float2 ParallaxOffset (half h, half height, half3 viewDir) 计算视差法线映射的UV偏移。可参考文章
可以理解成针对摄像机角度做了处理的凹凸效果。
fixed Luminance (fixed3 c) 将颜色转换为亮度(灰度)。
fixed3 DecodeLightmap (fixed4 color) 从Unity光照贴图解码颜色(基于平台为RGBM 或dLDR)
float4 EncodeFloatRGBA (float v) 为储存低精度的渲染目标,编码[0..1)范围的浮点数到RGBA颜色。
float DecodeFloatRGBA (float4 enc) 解码RGBA颜色到float。
float2 EncodeFloatRG (float v) 编码到RG通道
float DecodeFloatRG (float2 enc) 从RG通道解码到浮点数
float2 EncodeViewNormalStereo (float3 n) 编码视图空间法线到在0到1范围的两个数。
float3 DecodeViewNormalStereo (float4 enc4) 从enc4.xy解码视图空间法线

正向渲染辅助函数 (in UnityCG.cginc)

float3 WorldSpaceLightDir (float4 v) 计算世界空间方向(非归一化),给定对象空间顶点位置。
float3 ObjSpaceLightDir (float4 v) 计算对象空间方向(非归一化),给定对象空间顶点位置。
float3 Shade4PointLights (…) 从4个点光源计算亮度,来将光照数据牢固的装入向量中。正向渲染使用此来计算逐顶点光照。

屏幕辅助函数(in UnityCG.cginc)

float4 ComputeScreenPos (float4 clipPos) 计算用于执行屏幕空间映射纹理采样的纹理坐标。输入是剪辑空间位置。Computes texture coordinate for doing a screenspace-mapped texture sample. Input is clip space position.
float4 ComputeGrabScreenPos (float4 clipPos) 计算纹理坐标以对抓取过程纹理进行采样。输入是剪辑空间位置。Computes texture coordinate for sampling a GrabPass texure. Input is clip space position.

顶点照明辅助函数(in UnityCG.cginc)

float3 ShadeVertexLights (float4 vertex, float3 normal) 根据局部空间位置和法线,从4个逐顶点灯光和环境光计算亮度。
Computes illumination from four per-vertex lights and ambient, given object space position & normal.

Shader 数学函数 摘自 CSDN博文

  1. abs(x) 返回输入参数的绝对值;

  2. acos(x) 反余弦函数,输入参数范围[-1,1],返回[0,π]区间的角度值;

  3. all(x) 如果输入的参数均不为0,则返回true,否则返回false;

  4. any(x) 输入的参数只要有一个不为0,则返回true;

  5. asin(x) 反正弦函数,输入的参数取值区间[-1,1],返回角度值范围为[-π/2,π/2];

  6. atan(x) 反正切函数,返回角度值范围[-π/2,π/2];

  7. atan2(y,x) 计算y/x的反正切值;

  8. ceil(x) 对输入的参数向上取整;

  9. clamp(x,a,b) 如果x小于a,返回a;x大于b,则返回b;否则,返回x;

  10. cos(x) 返回x的余弦值,返回值范围[-1,1];

  11. cosh(x) 双曲余弦函数,计算x的双曲余弦值;

  12. cross(A,B) 返回两个三元向量的叉积,注意参数必须是三元向量;

  13. degrees(x) 输入参数为弧度值,函数将其转换为角度值;

  14. determinant(m) 计算矩阵的行列式因子;

  15. dot(A,B) 返回A和B的点积,参数可以是标量,也可以是向量;

  16. exp(x) 计算e^x的值,e=2.71828;

  17. exp2(x) 计算2^x的值;

  18. floor(x) 对输入的参数向下取整;

  19. fmod(x,y) 返回x/y的余数。如果y为0,结果不可预料;

  20. frac(x) 返回标量或者是每个向量组件的分数部分;

  21. frexp(x,out exp) 将浮点数x分解为尾数和指数,x=m*2^exp返回m,并将指数存入exp中,如果x为0,则尾数和指数都返回0;(不是很明白?)

  22. isfinite(x) 判断标量或者向量中的每个数据是否是无限,如果是返回true,否则返回false;

  23. isnan(x) 判断标量或者向量中的每个数据是否是非数据,如果是返回true,否则返回false;

  24. ldexp(x,n) 计算x*(2^n)的值;

  25. lerp(a,b,f) 计算(1-f)a + b*f 或者 a+f(b-a)的值,即在下限a和上限b之间进行插值,f表示权值。注意,如果a和b是向量,则权值f必须是标量或者等长的向量;

  26. lit(NdotL,NdotH,m) N表示法向量。L表示入射光向量。H表示半角向量。m表示高光向量。函数计算环境光,散射光,镜面光的贡献,返回四元向量: X表示环境光的贡献,总是1;Y表示散射光的贡献,如果N.L<0,则为0,否则为N.L; Z表示镜面光的贡献,如果N.L<0或者N.H<0,则为0;否则为(N.H)^m;W始终为1;

  27. log(x) 计算ln(x)的值,x必须大于0;

  28. log2(x) 计算log2^x的值,x必须大于0;

  29. log10(x) 计算log10^x的值,x必须大于0;

  30. max(a,b) 比较两个标量或者等长向量元素,返回最大值;

  31. min(a,b) 比较两个标量或者等长向量元素,返回最小值;

  32. mul(M,N) 计算两个矩阵相乘,如果M为AxB矩阵,N为BxC矩阵,则返回AxC矩阵;

  33. mul(M,v) 计算矩阵和向量相乘;

  34. mul(v,M) 计算向量与矩阵相乘;

  35. noise(x) 噪声函数,返回值始终在0-1之间,对于同样的输入,返回相同的值(也就是说并不是真正意义上的随机噪声);

  36. pow(x,y) 表示x^y;

  37. radians(x) 函数将角度值转换成弧度值;

  38. round(x) 四舍五入;

  39. saturate(x) 如果x小于0,返回0;如果x大于1,返回1;否则返回x;

  40. sign(x) 符号函数 ,如果x大于0,返回1;如果小于0,返回-1;否则返回0;

  41. sin(x) 输入参数为弧度,计算正弦值,返回值范围[-1,1];

  42. sincos(float x ,out s, out c) 该函数是同时计算x的sin值和cos值,其中s=sin(x),c=cos(x),这样比分开计算要快;

  43. smoothstep(min,max,x) x位于min和max之间,若x=min,返回0;若x=max,返回1;若x在两者之间,按下列公式返回数据:-2((x-min)/(max-min))^3+3((x-min)/(max-min))^2;

  44. step(a,x) 若x< a,返回0,否则返回1;

  45. sqrt(x) 求x的平方根,x必须大于0;

  46. tan(x) 输入参数为弧度,计算正切值;

  47. tanh(x) 计算双曲正切值;

  48. transpose(M) M为矩阵,计算其转置矩阵;

  49. distance(pt1,pt2) 两点之间的欧几里得距离;

  50. faceforword(N,I,Ng) 若Ng*I<0,返回N,否则返回-N;

  51. length(v) 返回一个向量的模;

  52. normalize(v) 归一化向量;

  53. reflect(I,N) 根据入射光方向向量,和顶点法向量N,计算反射光方向向量,其中I和N必须被归一化,需要注意的是:这个I是指向顶点的;函数只对三元向量有效;

  54. refract(I,N,eta) 计算折射向量,I为入射光线,N为法向量,eta为折射系数;其中I和N必须被归一化,如果I和N之间夹角太大,则返回(0,0,0),也就是没有折射光线;函数只对三元向量有效;
    纹理映射函数

  55. tex1D(sampler1D tex,float s) 一维纹理查询;

  56. tex1D(sampler1D tex, float s, float dsdx, float dsdy) 使用导数值查询一维纹理;

  57. Tex1Dproj(sampler1D tex, float2 sq) 一维投影纹理查询;

  58. Tex2D(sampler2D tex,float2 s) 二维查询纹理;

  59. Tex2Dproj(sampler2D tex, float4 szq) 二维投影纹理查询;

  60. Tex3D(sampler3D tex, float s) 三维纹理查询;

  61. Tex3Dproj(sampler3D tex, float4 szq) 查询三维投影纹理,并进行深度值比较;

  62. texCUBE(samplerCUBE tex, float3 s) 查询立方体纹理;

  63. texCUBEproj (samplerCUBE tex, float4 sq) 查询立方体投影纹理;

  64. ddx(a) 参数a对应一个像素位置,返回该像素值在X轴的偏导数;

  65. ddy(a) 参数a对应一个像素位置,返回该像素值在X轴上的偏导数;

  66. void debug(float4 x) 如果在编译时设置了debug,片段着色程序中调用该函数可以将值x作为COLOR语义的最终输出,否则该函数什么也不做;

0%